home *** CD-ROM | disk | FTP | other *** search
/ MacWorld UK 2000 March / MW_UK_2000_03.iso / Shareware World / Utilities / Text Processing / Alpha / Tcl / Menus / electricMenu.tcl < prev    next >
Encoding:
Text File  |  1999-10-19  |  11.2 KB  |  354 lines  |  [TEXT/ALFA]

  1. ## -*-Tcl-*-
  2.  # ###################################################################
  3.  #    Vince's    Additions -    an extension package for Alpha
  4.  # 
  5.  #    FILE: "electricMenu.tcl"
  6.  #                     created: 8/3/96 {1:34:42 pm}    
  7.  #                  last update: 15/9/1999 {8:51:34 pm}    
  8.  #    Author:    Vince Darley
  9.  #    E-mail:    <vince@santafe.edu>
  10.  #      mail:    317 Paseo de Peralta, Santa Fe, NM 87501, USA
  11.  #       www:    <http://www.santafe.edu/~vince/>
  12.  #    
  13.  #    Handles the electric menu.
  14.  #    
  15.  # ###################################################################
  16.  ##
  17.  
  18. alpha::menu electricMenu 1.3.3 global "•280" {
  19.     # so we don't use the standard proc to build this menu.
  20.     menu::buildProc elec "#"
  21.     namespace eval elec {}
  22. } { 
  23.     elec::rebuildElectricMenu 
  24. } {
  25. } maintainer {
  26.     "Vince Darley" vince@santafe.edu <http://www.santafe.edu/~vince/>
  27. } uninstall this-file help {file "ElecCompletions Help"}
  28.  
  29. alpha::package require elecCompletions 9.0
  30.  
  31. lunion flagPrefs(Electrics) showElectricsInMenu putTemplatesInMainMenu \
  32.   showElectricKeysInMenu addTemplateManipulators 
  33.  
  34. eval lunion elec::MenuTemplates ""
  35. lunion elec::LicenseTemplates \
  36.   "none" "copyrightNotice" "allRightsReserved" "allRightsReservedOrg" \
  37.   "seeFileLicenseTerms" "gnuPublicLicense"
  38.  
  39. # register this proc to be called whenever the mode changes.
  40. hook::register changeMode elec::rebuildElectricMenu
  41. hook::register electricBindings elec::BindingsChanged
  42. # To show mode-dependent electric completions in menu; i.e. include in the
  43. # menu all items which when typed, followed by cmd-Tab, will complete
  44. # into some command, click this box||To remove all mode-dependent
  45. # completions from the electric menu, once you've learnt everything that's
  46. # available, click this box.
  47. newPref flag showElectricsInMenu 1 global elec::clearAndBuildElectricMenu
  48. # To add the list of key-bindings to the bottom of the electric menu (these are
  49. # the items you may edit with 'Config->Special Keys', which are used to
  50. # trigger Completions, Expansions, Template Stop movement etc), click this
  51. # box||To remove the list of key-bindings from the electric menu, once 
  52. # you've learnt them all, click this box.
  53. newPref flag showElectricKeysInMenu 1 global elec::clearAndBuildElectricMenu
  54. # To add a couple of menu items to let you create or delete new templates,
  55. # click this box||To remove the menu items to create/delete templates, click
  56. # this box.
  57. newPref flag addTemplateManipulators 0 global elec::clearAndBuildElectricMenu
  58. # To put all the templates into the main electric menu rather than in a 
  59. # submenu, click this box||To place all templates in a sub-menu of the 
  60. # electric menu, click this box.
  61. newPref flag putTemplatesInMainMenu 0 global elec::clearAndBuildElectricMenu
  62.  
  63. proc elec::BindingsChanged {} {
  64.     global showElectricKeysInMenu
  65.     if {$showElectricKeysInMenu} {elec::clearAndBuildElectricMenu}
  66. }
  67.  
  68. proc elec::getMenuBindings {} {
  69.     global showElectricKeysInMenu keys::specialBindings
  70.     # get menu items which represent the current bindings
  71.     if {$showElectricKeysInMenu} {
  72.     return [menu::bindingsFromArray keys::specialBindings]
  73.     } else {
  74.     return ""
  75.     }
  76. }
  77.  
  78. ## 
  79.  # -------------------------------------------------------------------------
  80.  # 
  81.  # "elec::rebuildElectricMenu" --
  82.  # 
  83.  #  Reasonably clever procedure to construct a Template menu from the
  84.  #  ${mode}electrics array on the fly.  Works with 'ensemble' completions,
  85.  #  putting them in submenus (that's why the code is a little messy; I
  86.  #  couldn't dream up a neater method).
  87.  # -------------------------------------------------------------------------
  88.  ##
  89. proc elec::rebuildElectricMenu {args} {
  90.     set mmode [modeALike]
  91.     if {[cache::exists elecMenu::elec-${mmode}]} {
  92.     cache::readContents elecMenu::elec-${mmode}
  93.     message ""
  94.     } else {        
  95.     global ${mmode}electrics electricMenu showElectricsInMenu
  96.     
  97.     set m [list Menu -n ${electricMenu} -m -p elec::MenuProc]
  98.     # make the menu of electrics if desired
  99.     if {$showElectricsInMenu && [array exists ${mmode}electrics]} {
  100.         set items [lsort [array names ${mmode}electrics]]
  101.         # remove all contractions
  102.         set items [lremove -all -glob $items "*'*"]
  103.         # remove something else (I've forgotten what!)
  104.         regsub -all { [^ ]*\*[^ ]*} " $items " { } items
  105.         set c [set items]
  106.         while {[regexp {\{(\w+) \w+\}} $c all pref]} {
  107.         set c [string range $c [expr {[string last "\{$pref " $c] +2}] end]
  108.         lappend got $pref
  109.         }
  110.         if {[info exists got]} {
  111.         foreach pref $got {
  112.             regsub "(\{${pref} \\w+\} )+" $items \
  113.               "\{Menu -n \"   ${pref}\" -m -p elec::MenuProc \{\\0\}\} " items
  114.         }
  115.         }    
  116.     } else {
  117.         set items ""
  118.     }
  119.     # make the whole menu
  120.     set items [concat [elec::makeTemplatesMenu $mmode] $items "(-" \
  121.       [elec::getMenuBindings] [list "Add Electric Item"] ]
  122.     global addTemplateManipulators
  123.     if {$addTemplateManipulators} {
  124.         lappend items "Grab Selection" "Insert Old Selection" \
  125.           "Insert In Lines"
  126.     }
  127.     lappend items "Clear Elec Menu Cache"
  128.     lappend m $items
  129.     cache::add elecMenu::elec-${mmode} variable m
  130.     }
  131.     eval $m
  132. }
  133.  
  134. proc elec::clearAndBuildElectricMenu {args} {
  135.     cache::deletePat elecMenu::elec-*
  136.     elec::rebuildElectricMenu
  137. }
  138.  
  139. proc elec::makeTemplatesMenu {mmode} {
  140.     # make the templates submenu
  141.     global ${mmode}Templates elec::MenuTemplates \
  142.       elec::LicenseTemplates menu::additions putTemplatesInMainMenu
  143.     set m ${elec::MenuTemplates}
  144.     if {[info exists ${mmode}Templates]} {
  145.     set m [concat $m [set ${mmode}Templates]]
  146.     }
  147.     set m [lsort $m]
  148.     eval lappend m "(-" [lsort [lremove ${elec::LicenseTemplates} "none"]]
  149.     if {[info exists menu::additions(elec)]} {
  150.     foreach i [set menu::additions(elec)] {
  151.         eval lappend m "(-" [lrange $i 2 end]
  152.     }
  153.     }
  154.     lappend m "(-" "addTemplateItem" "removeTemplateItem"
  155.     if {$putTemplatesInMainMenu} {
  156.     foreach i $m {
  157.         if {[lindex $i 0] == "Menu"} {
  158.         lappend ret $i
  159.         } else {
  160.         lappend ret "[quote::Prettify $i] "
  161.         }
  162.     }
  163.     return $ret
  164.     } else {    
  165.     return [list "Menu -n Templates -p elec::userTemplates [list $m]"]
  166.     }
  167.     
  168. }
  169.  
  170. proc elec::rebuildTemplatesMenu { {mmode ""} } {
  171.     if {$mmode == ""} {set mmode [modeALike]}
  172.     eval [lindex [elec::makeTemplatesMenu $mmode] 0]
  173. }
  174.  
  175. proc elec::userTemplates {menu item} {
  176.     set t [file::$item]    
  177.     if {$t != ""} {
  178.     elec::Insertion $t
  179.     }
  180. }
  181.  
  182. proc elec::MenuProc {menu item} {
  183.     switch -- $item {
  184.     "Next Stop Or Indent" {bind::IndentOrNextstop}
  185.     "Prev Stop" { ring::- }
  186.     "nth Stop" {ring::nth}
  187.     "Complete" {bind::Completion}
  188.     "Complete Or Tab" {bind::TabOrComplete}
  189.     "Expand" {bind::Expansion}
  190.     "Next Stop" {ring::+}
  191.     "Real Tab" {insertActualTab}
  192.     "Add Electric Item" {elec::AddItem}
  193.     "Grab Selection" {elec::GrabSelection}
  194.     "Insert Old Selection" {elec::InsertOldSelection}
  195.     "Insert In Lines" {elec::InsertInLines}
  196.     "Clear All Stops" {ring::clear}
  197.     "Clear Elec Menu Cache" {elec::clearAndBuildElectricMenu}
  198.     default {
  199.         if {[regexp {(.*) $} $item "" item]} {
  200.         set item [join $item ""]
  201.         elec::userTemplates $menu \
  202.           [string tolower [string index $item 0]][string range $item 1 end]
  203.         } else {
  204.         if {[set p [mode::getProc Completion::Insert]] != ""} {
  205.             $p $item
  206.         } else {
  207.             insertText $item
  208.             bind::Completion
  209.         }
  210.         }
  211.     }
  212.     }
  213. }
  214.  
  215. proc elec::AddItem {} {
  216.     global mode
  217.     if {$mode == ""} { beep ; message "No mode set…" ; return }
  218.     global ${mode}electrics
  219.     set e [prompt "Enter the electric item for '$mode' mode:" ""]
  220.     if {$e == ""} {return}
  221.     set default [file::_varValue ${mode}electrics($e)]
  222.     #[file::_getDefault "Do you want to start with this as the template?"]
  223.     set value [getline "Enter the electric extension, using •prompt•, \\r \\\{, \\\} etc" $default]
  224.     if {$value != ""} {
  225.     if {[string length $value] > 210} {
  226.         alertnote "Alpha unfortunately truncates direct entry to about 200 characters, however you can add directly to arrdefs.tcl"
  227.     }
  228.     eval set ${mode}electrics($e) \"$value\"
  229.     addArrDef ${mode}electrics $e [set ${mode}electrics($e)]
  230.     cache::deletePat elecMenu::elec-[modeALike]
  231.     elec::rebuildElectricMenu
  232.     }
  233. }
  234.  
  235. proc file::addTemplateItem {} {
  236.     global elec::MenuTemplates mode
  237.     global ${mode}Templates
  238.     set v elec::MenuTemplates
  239.     set v [expr {$mode != "" && [dialog::yesno \
  240.       "Is this item '$mode' mode-specific (otherwise I'll make it global)?"] \
  241.       ? "${mode}Templates" : "elec::MenuTemplates"}]
  242.     set e [join [prompt "Enter the new template menu item name:" ""] ""]
  243.     if {$e == ""} {return}
  244.     set e [string tolower [string index $e 0]][string range $e 1 end]
  245.     set default [file::_getDefault "Do you want to start with this as the template?" t]
  246.     set t "\r"
  247.     append t "proc file::${e} \{\} \{\r"
  248.     append t "\t# You must fill this in\r"
  249.     append t $default
  250.     append t "\r\r\telec::Insertion \$t\r\}\r"
  251.     addUserLine $t
  252.     lappend $v $e
  253.     lappend modifiedVars $v
  254.     elec::rebuildTemplatesMenu
  255.     regsub -all "\r" $default ";" default
  256.     append default { elec::Insertion $t}
  257.     ;proc file::$e {} $default
  258.     elec::clearAndBuildElectricMenu
  259.     if {[dialog::yesno "I've added a template for the procedure to your 'prefs.tcl'. Do you want to edit it now?"]} {
  260.     global::editPrefsFile
  261.     goto [maxPos]
  262.     }
  263.     return ""
  264. }
  265.  
  266. proc file::removeTemplateItem {} {
  267.     global elec::MenuTemplates mode
  268.     global ${mode}Templates
  269.     global modifiedVars
  270.     set tlist ${elec::MenuTemplates}
  271.     catch {set tlist [concat $tlist [set ${mode}Templates]]}
  272.     set l [listpick -p "Which template shall I permanently remove?" \
  273.       [lsort $tlist]]
  274.     if {[set i [lsearch -exact ${elec::MenuTemplates} $l]] != -1} {
  275.     set elec::MenuTemplates [lreplace ${elec::MenuTemplates} $i $i]
  276.     lappend modifiedVars elec::MenuTemplates
  277.     } else {
  278.     set i [lsearch -exact [set ${mode}Templates] $l]
  279.     set ${mode}Templates [lreplace [set ${mode}Templates] $i $i]
  280.     lappend modifiedVars ${mode}Templates
  281.     }
  282.     elec::rebuildTemplatesMenu
  283.     elec::clearAndBuildElectricMenu
  284.     global::editPrefsFile
  285.     set pat "\rproc\[ \t\]+file::"
  286.     append pat $l
  287.     append pat "\[ \t\]+\{\[ \t\]*\}\[ \t\]\{(\r\[^\}\].*)*\r\}\r"
  288.     while 1 {
  289.     set fpos [search -f 1 -r 1 -n $pat 0]
  290.     if {[llength $fpos] == 0} {
  291.         break
  292.     }
  293.     eval deleteText $fpos
  294.     }
  295.     while 1 {
  296.     set fpos [search -f 1 -r 1 -n "^(\r\r|\n\n)" 0]
  297.     if {[llength $fpos] == 0} {
  298.         break
  299.     }
  300.     eval replaceText $fpos "\r"
  301.     }
  302.     save
  303.     return ""
  304. }
  305.  
  306.  
  307. # procedures below get added to the menu if you set the 'poweruser' flag
  308. # in "elecBindings.tcl".  They make it easy to create large template 
  309. # procedures 
  310. proc elec::GrabSelection {} {
  311.     global __elec::grabbed
  312.     set __elec::grabbed [getSelect]
  313. }
  314.  
  315. proc elec::InsertOldSelection {} {
  316.     global __elec::grabbed
  317.     insertText [quote::Insert [set __elec::grabbed]]
  318. }
  319.  
  320. proc elec::InsertInLines {} {
  321.     global __elec::grabbed
  322.     insertText [elec::_MakeIntoInsertion ${__elec::grabbed}]
  323. }
  324.  
  325. proc elec::_MakeIntoInsertion {t {var "t"}} {
  326.     if {$t == ""} { return $t }
  327.     regsub -all "\n" $t "\r" t
  328.     while 1 {
  329.     set ret [string first "\r" $t]
  330.     if { $ret == -1 } { set ret [string length $t] }
  331.     append b [string range $t 0 $ret]
  332.     if {[string length $b] > 20} {
  333.         while 1 {
  334.         append a "\tappend $var \"[quote::Insert [string range $b 0 59]]\"\r"
  335.         if {[set b [string range $b 60 end]] == ""} {
  336.             break
  337.         }
  338.         }
  339.     }
  340.     set t [string range $t [incr ret] end]
  341.     if {[string length $t] == 0} { 
  342.         if {$b != ""} {
  343.         append a "\tappend $var \"$b\"\r"
  344.         }
  345.         break 
  346.     }
  347.     }
  348.     return $a
  349. }
  350.  
  351.  
  352.  
  353.  
  354.